<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function fn1(num1){
	        return num1+100;
	    }

        // 栈内存 存放 基本数据类型  number string boolean null undefined 
        // 堆内存 存放 复杂数据类型  
            // 复杂数据类型 数据体在堆内存 
            // 名字在栈内存   
            // 堆内存的地址 给到栈内存 
        // 函数在定义阶段做了什么事情  熟练背诵  


        // 1. 在栈内存 开辟一个空间  起个名字 fn1
        // 2. 在堆内存 开辟一个空间  把函数的代码一模一样的存储到这个空间(此时此刻不解析函数内的代码)
        // 3. 堆内存的地址给 fn1所在的栈内存空间 



        // fn1(666)
        // 调用阶段做了什么事情

        // 开始调用  
        // 先到栈内存 查看是否存在这个fn1名字 如果不存在 报错 fn1 not defined
        // 如果存在这个名字  查看里边是否是个函数 如果不是函数报错 fn1 not a function  

        // 如果是函数  接着执行下一步  

        // 先在调用栈内开辟一个执行空间  
        // 在执行空间内 给形参赋值  
        // 在执行空间内 函数内的代码预解析  
        // 在执行空间内  把函数内的代码执行一遍  
        // 执行完毕  销毁这个执行空间  
        function fn5(a) {
            console.log(a);
            function a() {

            }
        }

        fn5(100)


        // 形参赋值  和 函数内预解析 到底谁在前面 

        //预解析 
        // 声明一个变量  赋值一个函数  
        // 预解析结束  fn5是个函数 


        // 开始执行   

        fn5(100)

        // 假如 先给形参赋值 
        // a赋值为100 

        // 接下来 函数内的代码预解析  
        // 声明一个变量a  并且赋值为一个函数 
        // 函数体内预解析结束  
        // 函数内的代码开始执行   
        // 将a输出到控制台   

        // a是个函数  
        // 所以 把这个函数体输出到控制台  



        // 假如 先函数内代码预解析
        // 声明变量a  并且赋值为一个函数
        // 预解析结束 
        // a 是个函数  
        
        // 接下来形参赋值  a 被赋值为 100 
        // 将 100 输出到控制台 


   // 结果显示 输出到控制台的是函数体  

   // 所以 形参赋值 在  函数体内预解析的前面   
    </script>
</body>

</html>